package cn.fu.algorithm;

import java.util.HashSet;
import java.util.Set;

/**
 * @Title: BagEncript.java
 * @Package com.viewhigh.yhrpweb.web.sys.service.impl
 * @Description: 解超递增背序利
 * @author zhangxiaofu
 * @Company www.viewhigh.com
 * @date 2016年7月25日 下午3:51:46
 * @version V1.0
 */
public class KnapsackSolution {

	public static void main(String[] args) {
		// 求2的n次方的值
		System.err.println(Math.pow(2, 4));
		log(16);
		int[] a = { 1, 2, 4, 8 };
		int initVal = 6;
		// test(initVal ,a);
		for (int i = 1; i < 1 << a.length; i++) {
			int sum = 0;
			StringBuffer sb = new StringBuffer();
			for (int j = 0; j < a.length; j++) {
				if ((i & 1 << j) != 0) {
					sum += a[j];
					sb.append(a[j]).append("+");
				}
			}
			if (sum == initVal) {
				System.out.println(sb);
			}
		}
	}

	// 判断一个数是2的几次方
	public static void log(int n) {
		int a = 0;
		int stmp = n;
		while (n % 2 == 0) {
			n = n / 2;
			a++;
		}
		if ((int) Math.pow(2, 4) == stmp) {
			System.out.println(a);
		}
	}

	// 判断一个数是2的几次方
	public static void test() {
		int count = 0;
		int num = 111;
		int temp = num;
		// System.out.println(num>>6);
		while (num != 1) {
			num = num >> 1;
			count++;
		}
		System.out.println(temp + "是" + 2 + "的" + count + "次方");
	}

	// 判断是由哪些（权限）组成
	public static void test(int sum, int[] arr) {
		Set<Integer> set = new HashSet<Integer>();
		for (int i : arr) {
			if ((i & sum) != 0) {
				set.add(i);
				System.err.println(i);
			}
		}
	}
}
